#include "bola.h"

int VELOCIDADE_INICIAL_BOLA;
int VELOCIDADE_MISSIL;

void play_sound(int, int);
void start_sound(int);
void setTimer(int*, int);

Bola* newBola(float x, float y, float vx, float vy, char tipo, int raio, int cor) {
	Bola * b = (Bola*)malloc(sizeof(Bola));
	b->x = x; b->y = y;
	b->vx = vx; b->vy = vy;
	b->raio = raio;
	b->cor = cor;
	b->tipo = tipo;
	return b;
}

void drawBola(Bola* b, char* base)
{
	float dx = -b->raio;
	for(; dx <= b->raio; dx++)
	{
		float dy = b->raio * sin(acos(dx / (float)b->raio));
		draw_line(b->x + dx, b->y - dy, b->x + dx, b->y + dy, b->cor, base);
		set_pixel((int)(b->x + dx), (int)(b->y + dy), BRIGHT, base);
		set_pixel((int)(b->x + dx), (int)(b->y - dy), b->cor | BRIGHT, base);
	}
}

void eraseBola(Bola* b, char* base)
{
	int dx = -b->raio;
	for(; dx <= b->raio; dx++)
	{
		int dy = (int)(b->raio * sin(acos(dx / (float)b->raio)) );
		draw_line(b->x + dx, b->y - dy , b->x + dx, b->y + dy, BLACK, base);
	}
}

void updatePositionBola(Bola* b, Bonus_velocidade velocidade)
{
	float vx = b->vx;
	float vy = b->vy;
	
	switch(velocidade)
	{
		case VMETADE:
			vx /= 2.0;
			vy /= 2.0;
			break;
		case VDOBRO:
			vx *= 2.0;
			vy *= 2.0;
			break;
	}
	
	float new_x = b->x + vx;
	float new_y = b->y + vy;
	// Detectar colisões com as bordas do ecrã
	if(new_x + b->raio >= HRES)
	{
		b->vx = -b->vx;
		new_x -= vx; 
		if(timer_som_colisao == 0)
		{
			start_sound(200);
			setTimer(&timer_som_colisao, 20);
		}
	}
	else if(new_x - b->raio < 0)
	{
		b->vx = -b->vx;
		new_x -= vx;
		if(timer_som_colisao == 0)
		{
			start_sound(200);
			setTimer(&timer_som_colisao, 20);
		}
	}
	if(new_y + b->raio >= VRES)
	{
		b->vy = -b->vy;
		new_y -= vy; 
		if(timer_som_colisao == 0)
		{
			start_sound(200);
			setTimer(&timer_som_colisao, 20);
		}
	}
	else if(new_y - b->raio < TOP_BORDER)
	{
		b->vy = -b->vy;
		new_y -= vy;
		if(timer_som_colisao == 0)
		{
			start_sound(200);
			setTimer(&timer_som_colisao, 20);
		}
	}

	b->x = new_x;
	b->y = new_y;
}
